from langchain.agents import create_agent
from app.tools.common import download_bibili_audio, get_poster_info, get_poster_latest_video, upload_to_oss, search_web
from app.tools.mcp import get_all_mcp_tools
from app.utils.llms import get_chat_model
import os
import asyncio

os.environ["LANGSMITH_API_KEY"] = "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"
os.environ["LANGSMITH_TRACING"] = "true"

async def create_agent_with_tools():
    """创建带有所有工具的代理"""
    mcp_tools = await get_all_mcp_tools()
    common_tools = [
        download_bibili_audio,
        upload_to_oss,
        get_poster_info,
        get_poster_latest_video,
        search_web,
    ]
    tools = mcp_tools + common_tools

    prompt = """
    你是一个AI新闻整理助手，能够使用提供的工具来完成任务。调取查询音频转换工具的时间隔5秒，避免调用频率过快。你可以在调用工具之前通过输出123..的方式进行读秒

    基本任务流程：
    - 用户输入想获取的b站博主名称，例如“AI日报”、“科技补全”、“Github一周热点”等
    - 你需要先调用get_poster_info获取可访问的b站博主的信息，查看是否包含用户输入的名称。若不包含，拒绝提供服务并输出可访问的b站博主名称列表。
    - 调用get_poster_latest_video获取指定b站博主最新与AI新闻相关视频信息
    - 调用download_bibili_audio下载视频音频
    - 调用upload_to_oss上传音频到OSS
    - 调用mcp_tools中的工具，将音频转换为文字。
    - 若发现转换后的文字中包含错误/不完整的的名称、单词或错别字，你需要调用web_search工具来查找正确的单词或解释。
    - 对文字进行分析，提取并整理新闻内容，最终输出Markdown格式新闻汇报文档
    
    注意：
    - 语言转文本的工具可能识别出错别字、多音字，在生成新闻报告时需要注意这一点。
    - 最终的新闻报告需要符合Markdown格式，包含新闻标题、发布时间、发布者、视频bvid这些元信息。
    - 如果有不确定的错别字、多音字、错误单词等内容，你可以调用web_search工具来查找正确的单词或解释。这一点非常重要，不能忽略。

    输出结构：
    元信息：
    - 新闻标题：新闻标题，与视频标题相关，例如“AI日报20251025”
    - 发布时间：视频发布时间，格式为“2025-10-25 15:00:00”
    - 发布者：视频发布者，例如“AI日报”
    - 视频bvid：视频bvid，例如“BV1i9snzPEDq”
    
    新闻内容：
    - 具体结构根据视频内容而定，可能包含多个项目，自由发挥，若能从视频描述中拿到项目链接，需要在项目内容后添加链接。
    """

    return create_agent(
        model=get_chat_model(model="deepseek-chat",provider="deepseek"),
        tools=tools,
        system_prompt=prompt,
    )

# 创建代理实例
agent = asyncio.run(create_agent_with_tools())